/**API DOCUMENTATION Plugin Validator
 * 
 * AUTORES: Roberto Okamura e Cainã Oliboni
 * OPTIONS:
 * debug: Habilita-se o modo debug se ele for verdadeiro(debug:true), o debug funciona não deixando o formulario ser enviado, 
 * sendo assim é uma opção perfeita para a fase de testes do componente, pois ocorre a validação e mesmo ele não é enviado,
 * valores(true, false)
 * 
 * submitHandler: Retorna o valor corrente do submit quando o formulario é valido. seu default utiliza da chamada normal ao 
 * servidor, porem podemos utilizar uma chamada ajax tambem, usando $(form).ajaxSubmit();
 * 
 * invalidHandler: Retorna um codigo customizado quando um formulario invalido é enviado, é uma função em que o primeiro argumento
 * é um evento e o segundo um validador utilizado assim invalidHandler:function(event, validator){//codigo};
 * 
 * ignore: os elementos passados pelo seu seletor são ignorados pelas validações, ex: ignore:$("nomeFormulario\\:nomeElemento").
 * 
 * rules: chave:valor que define as regras costumizadas. a chave é o nome do elemento (ou grupo de checkbox/botões radio),
 * o valor pode ser um objeto consistente da rule, email:required. pode ser pares de parametro, por exemplo minlength:2. e por
 * string ex: nomeCampo:"required". pode ser especificado para classe, atributo e arquivos de rules, e tambem podem ser aplicadas
 * caso haja alguma condição exemplos abaixo
 * 
 *String:
 * $(".selector").validate({
  rules: {
    // simple rule, converted to {required:true}
    name: "required"
  }
});
 *
 *Consistente da rule:
 *$(".selector").validate({ 
  rules: {
    campoEmail:{
    email:true
  }
 * 
 * Pares de parametro
 * *$(".selector").validate({
  rules: {
    campoEmail:{
    minlength:1
  }
 * 
 * 
 * exemplo de regra com condição:
 * $(".selector").validate({
  rules: {
    contact: {
      required: true,
      email: {
        depends: function(element) {
          return $("#campoCheckBox").is(":checked");
        }
      }
    }
  }
});
 * onde o email é setado como verdadeiro caso o checkbox esteja checado.
 *  
 *
 *messages: chave e valor definem as mensagens costumizadas. chave é o valor do elemento e o valor é a mensagem que o usuario 
 *deseja que seja escrito na validação. em vez de uma mensagem unica para todos os campos, é possivel varia-la de acordo com a
 *rule implementada, caso não sobrescreva a mensagem, existe uma padrão para cada tipo de validação. exemplo de sobrescrita:
 *
 *$(".selector").validate({
  rules: {
    name: "required",
    email: {
      required: true,
      email: true
       minlength: 2
    }
  },
  messages: {
    name: "Insira seu nome por favor",
    email: {
      required: "É necessario inserir o endereço",
      email: "Seu email necessita estar no formato correto"
      //formato de mensagem JQuery onde o {0} é o numero colocado no minlength
      minlength: jQuery.format("At least {0} characters required!")

    }
 *
 *
 *groups: Especifica um grupo de mensagens de erro, um grupo consiste em um nume arbritario como chave e um espaço separando a
 *lista de nomes de elementos como os valores use o errorReplacement para controlar onde as mensagens de grupo serão alocadas.
 *
 *
 *onsubmit: Valida o formulario antes de ser enviado. recebe um boolean, caso falso ele desabilita essa validação feita antes
 *do submit, porém as validações de keyup, blur, click continuam iguais ex - onsubmit:false; ele é verdadeiro por default.
 *
 *onfocusout: Valida elementos(exceto checkbox e radiobutton) quando se perde o foco, se deixa-lo invalido todas as regras são 
 *puladas exceto quando um campo ja esta marcado como invalido, validando apenas na hora em que o formulario é enviado. pode
 *receber um boolean(falso apenas, true não é considerado) ou uma função (function(element, event))  decidindo por si mesmo quando
 *a validação rodará
 *
 *onkeyup - Tipo: Boolean ou Function() - Enquanto o usuário não clicar fora do campo, não aparece nenhuma mensagem. 
 *Deixe como false para utilizá-lo. 
 *Exemplo:
 *$(".selector").validate({
 *  onkeyup: false
 *});
 *
 *focusCleanup (default: false) Tipo: Boolean - Supondo que o usuário já tenha inserido alguma informação no campo,
 *a mensagem de falha ou sucesso estará sendo mostrada. Nessa função ao clicar no campo a mensagem é desaparece.
 *Exemplo:
 *$(".selector").validate({
 *  focusCleanup: true
 *});
 *
 *errorPlacement (default: Coloca o erro após o elemento inválido) - Mostra a mensagem de erro em tempo real.
 *Exemplo:
 *$("#myform").validate({
 *	errorPlacement: function (error,element){
 *		error.insertAfter(element);
 *	}
 *});
 *
 *highlight: Realça o campo no caso do campo ainda estar inválido. Ao digitar e ao sair do campo.
 *Exemplo:
 *$(".selector").validate({
 *	highlight: function(element, errorClass) {
 *    $(element).fadeOut(function() {
 *          $(element).fadeIn();
 *    });
 *  }
 *});
 *
 *unhighlight: Funciona como o highlight porém realça quando o campo está válido.
 *
 *ignoreTitle (default: false) - Define para pular a leitura de mensagens do atributo, ajuda a evitar problemas com o Google Toolbar. 
 *O default seria false para compatibilidade, a mensagem do título seria possível remover completamente em uma versão futura.
 *Exemplo:
 *$(".selector").validate({
 *	ignoreTitle: true
 *});
 *
 *
 *
*/

var validator = new Validator();

function Validator(){
	
	
}

Validator.prototype.construirValidador = function(seletor, jsonOptions, flagJsp){
	
	if(!seletor){
		
		return false;
	}
	
	var flag = flagJsp;
	//Metodos adicionais de validação de cnpj e cpf.
	$.validator.addMethod("cnpjValidator", function(value, element) {
		
		//.match retorna null se não passar pelo regex, e retorna o valor testado caso passe no regex
	    return this.optional(element) || value.match(/[0-9]{2}\.?[0-9]{3}\.?[0-9]{3}\/?[0-9]{4}\-?[0-9]{2}/);

	}, "Por favor insira um valor de CNPJ válido");
	
	$.validator.addMethod("cpfValidator", function(value,element){
	
		return this.optional(element) || value.match(/[0-9]{3}\.?[0-9]{3}\.?[0-9]{3}\-?[0-9]{2}/);
		
	}, "Por favor insira um valor de CPF válido");
	
	$.validator.addMethod("urlShort", function(value, element) {
		// Verifica validação da url sem http...
		return this.optional(element) || value.match(/^(www\.)[A-Za-z0-9_-]+\.+[A-Za-z0-9.\/%&=\?_:;-]+$/);
		},"Preencha um endereço correto!");

	 
	
	
	//Validador generico por span e div
	//Após verificadas todas as rules ele da extend no jsonRulesExtend e vai concatenando as rules pra cada campo
	var jsonRules = {};
	//Após verificadas todas as messages ele da extend no jsonMessagesExtend e vai concatenando as messages pra cada campo
	var jsonMessages = {};
	//Json que será usado para concatenar as rules de cada campo
	var jsonRulesExtend = {};
	//Json que será usado para concatenar as mensagens das rules de cada campo
	var jsonMessagesExtend = {};
	var jsonRulesCampo = null;
	var jsonMessagesCampo = null;
	
	//Retira o "#" do seletor, a variavel é utilizada posteriormente no laço abaixo
	var formulario = seletor.replace("#","");
	//Laço que roda todos os elementos da tela de acordo com a quantidade, procurando pelo formulario passado
	for(var i=0; i<document.forms[formulario].elements.length; i++){
		
		//utiliza o nome do campo a ser validado com o prefixo "nomeFormulario:" sendo assim "nomeFormulario:nomeCampo", que é utilizado para validar o campo nas rules
		var campoValidacao = document.forms[formulario].elements[i].id;
		//utiliza o seletor passado sem o "#" e adiciona o ":" a ele, sendo assim, seletorReplace fica assim "nomeFormulario:"
		var seletorReplace = formulario + ":";
		//utiliza seletorReplace para retirar o prefixo do nome do campo, deixando apenas seu id no caso "nome:campo"
		var idCampo = campoValidacao.replace(seletorReplace, "");
		 	//verifica se o campo da validação tem o prefixo "nomeFormulario:" fornecendo apenas campos dentro do formulario no jsf
		 	if(campoValidacao.contains(seletorReplace) || flag){
		 		//verifica a quantidade de spans que correspondem a cada validação dentro da div padrão para a validação(quando retornado 0 funciona como um falso e não entra na condição
		 		if($("#" + idCampo + "_div span").length){
					//Pega o nome do campo para ser utilizado em algumas mensagens
					var labelCampo = $("#" + idCampo + "_div label").text();
					labelCampo = labelCampo.replace(":","");
					
					jsonRulesCampo = null;
					jsonMessagesCampo = null;
					
					//pega cada span dentro da div padrão, onde cada span simboliza uma verificação
					$("#" + idCampo + "_div span").each(function(){
						/**
						 * required - Caso o campo estiver vazio, retorna uma mensagem pedindo que o usuário informe o campo.
						 */	
						
						if($(this).attr("name") == "required"){
							
							console.log("entrooooo");
							jsonRulesCampo = {};
							jsonRulesCampo[campoValidacao] = {"required":true};
							$.extend(jsonRulesExtend, jsonRulesCampo);
							
							
							if($(this).attr("message")){
								
								if(!jsonMessagesCampo){
									
									jsonMessagesCampo = {};
									jsonMessagesCampo[campoValidacao] = {"required":$(this).attr("message")};
		
								}
								
								else{
									
									jsonMessagesCampo[campoValidacao] = {"required":$(this).attr("message")};
									
								}
								
								$.extend(jsonMessagesExtend, jsonMessagesCampo);
								
							}
							else{
								
								if(!jsonMessagesCampo){
									
									jsonMessagesCampo = {};
									jsonMessagesCampo[campoValidacao] = {"required":" O campo " + labelCampo + " é obrigatório"};
									
								
								}
								else{
									
									$.extend(jsonMessagesCampo[campoValidacao] = {"required":" O campo " + labelCampo + " é obrigatório"});
									
								}
								
								$.extend(jsonMessagesExtend, jsonMessagesCampo);
							}
						
						}
						
						/**
						 * email - Validação do Email, o usuário deve digitar o email corretamente.Ex: "nome@email.com".
						 */
						if($(this).attr("name") == "email"){
							
							
							if(!jsonRulesCampo){
								
								jsonRulesCampo = {};
								jsonRulesCampo[campoValidacao] = {"email":true}; 
							
							}
							
							else{
								
								$.extend(jsonRulesCampo[campoValidacao], {"email":true});
							
							}
							
							$.extend(jsonRulesExtend, jsonRulesCampo);
								
							if($(this).attr("message")){
								
								if(!jsonMessagesCampo){
									
									jsonMessagesCampo = {};
									jsonMessagesCampo[campoValidacao] = {"email":$(this).attr("message")};
							
								}
								else{
									
									$.extend(jsonMessagesCampo[campoValidacao], {"email":$(this).attr("message")});
									
								}
								
								$.extend(jsonMessagesExtend, jsonMessagesCampo);
								
							}
							else{
								
								if(!jsonMessagesCampo){
									
									jsonMessagesCampo = {};
									jsonMessagesCampo[campoValidacao] = {"email":" O campo " + labelCampo + " deve estar com o formato de email correto!"};
									
									
								}
								else{
									
									$.extend(jsonMessagesCampo[campoValidacao], {"email":" O campo " + labelCampo + " deve estar com o formato de email correto!"});
									
								}
								
								$.extend(jsonMessagesExtend, jsonMessagesCampo);
								
							}
							
							
						}
						
						if($(this).attr("name") == "remote"){
							
							if(!jsonRulesCampo){
								
								jsonRulesCampo = {};
								jsonRulesCampo[campoValidacao] = {"remote":$(this).text()};
						
							}
							
							else{
								
								$.extend(jsonRulesCampo[campoValidacao], {"remote":$(this).text()});
									
							}
							
							$.extend(jsonRulesExtend, jsonRulesCampo);
							
							if($(this).attr("message")){
								
								if(!jsonMessagesCampo){
									
									jsonMessagesCampo = {};
									jsonMessagesCampo[campoValidacao] = {"remote":$(this).attr("message")};
							
								}
								else{
									
									$.extend(jsonMessagesCampo[campoValidacao], {"remote":$(this).attr("message")});

								}
								
								$.extend(jsonMessagesExtend, jsonMessagesCampo);
							}
							
						}
						
						/**
						 * minlength - O usuário define a quantidade mínima de caracteres para o campo.
						 */
						if($(this).attr("name") == "minlength"){
							
							if(!jsonRulesCampo){
								
								jsonRulesCampo = {};
								jsonRulesCampo[campoValidacao] = {"minlength":$(this).text()}; 
				
							}
							
							else{
								
								$.extend(jsonRulesCampo[campoValidacao], {"minlength":$(this).text()});
								
							}
							
							$.extend(jsonRulesExtend, jsonRulesCampo);
							
							if($(this).attr("message")){
								
								if(!jsonMessagesCampo){
									
									jsonMessagesCampo = {};
									jsonMessagesCampo[campoValidacao] = {"minlength":$(this).attr("message")};
								
								}
								else{
									
									$.extend(jsonMessagesCampo[campoValidacao], {"minlength":$(this).attr("message")});
									
								}
								
								$.extend(jsonMessages, jsonMessagesCampo);
							
							}
							else{
								
								if(!jsonMessagesCampo){
									
									jsonMessagesCampo = {};
									jsonMessagesCampo[campoValidacao] = {"minlength":" O campo " + labelCampo + " deve ter no mínimo " + $(this).text() + " caracteres!"};									
								}
								else{
									
									$.extend(jsonMessagesCampo[campoValidacao],{"minlength":" O campo " + labelCampo + " deve ter no mínimo " + $(this).text() + " caracteres!"});
								}
								
								$.extend(jsonMessagesExtend, jsonMessagesCampo);
							}
							
						}
						
						/**
						 * maxlength - O usuário define a quantidade máxima de caracteres para o campo.
						 */
						if($(this).attr("name") == "maxlength"){
							
							if(!jsonRulesCampo){
								
								jsonRulesCampo = {};
								jsonRulesCampo[campoValidacao] = {"maxlength":$(this).text()}; 
				
							}
							
							else{
								
								$.extend(jsonRulesCampo[campoValidacao], {"maxlength":$(this).text()});
								
							}
							
							$.extend(jsonRulesExtend, jsonRulesCampo);
							
							if($(this).attr("message")){
								
								if(!jsonMessagesCampo){
									
									jsonMessagesCampo = {};
									jsonMessagesCampo[campoValidacao] = {"maxlength":$(this).attr("message")};
								
								}
								
								else{
									
									$.extend(jsonMessagesCampo[campoValidacao], {"maxlength":$(this).attr("message")});
								}
								
								$.extend(jsonMessagesExtend, jsonMessagesCampo);
								
							}
							else{
								
								if(!jsonMessagesCampo){
									
									jsonMessagesCampo = {};
									jsonMessagesCampo[campoValidacao] = {"maxlength":" O campo " + labelCampo +  "deve ter no máximo " + $(this).text() + " caracteres!"};
								
								}
								
								else{
									
									$.extend(jsonMessagesCampo[campoValidacao], {"maxlength":" O campo " + labelCampo +  "deve ter no máximo " + $(this).text() + " caracteres!"});
								
								}
								
								$.extend(jsonMessagesExtend, jsonMessagesCampo);
							}
							
						}
						
						/**
						 * rangelength - Limita para o usuário a quantidade de caracteres no campo. 
						 * Exemplo: rangelength: [2,6] --> abcdef. Caso digitar menos de 2 ou mais de 6 caracteres retorna mensagem de erro para o usuário.
						 * 
						 */
						if($(this).attr("name") == "rangelength"){
							
							if(!jsonRulesCampo){
								
								jsonRulesCampo = {};
								jsonRulesCampo[campoValidacao] = {"rangelength":$(this).text()}; 
				
							}
							
							else{
								
								$.extend(jsonRulesCampo[campoValidacao], {"rangelength":$(this).text()});
								
							}
							
							$.extend(jsonRulesExtend, jsonRulesCampo);
							
							if($(this).attr("message")){

								if(!jsonMessagesCampo){
									
									jsonMessagesCampo = {};
									jsonMessagesCampo[campoValidacao] = {"rangelength":$(this).attr("message")};
								
								}
								
								else{
									
									$.extend(jsonMessagesCampo[campoValidacao], {"rangelength":$(this).attr("message")});
								}
								
								$.extend(jsonMessagesExtend, jsonMessagesCampo);
								
							}
							else{
								
								var range = $(this).text().replace("[","");
								range = range.replace("]","");
								var rangeFormatada = range.split(",");
								
								if(!jsonMessagesCampo){
									
									jsonMessagesCampo = {};
									jsonMessagesCampo[campoValidacao] = {"rangelength":" O campo " + labelCampo + " deve ser entre " + rangeFormatada[0] + " e " + rangeFormatada[1] + " caracteres! "};
							
								}
								else{
									
									$.extend(jsonMessagesCampo[campoValidacao], {"rangelength":" O campo " + labelCampo + " deve ser entre " + rangeFormatada[0] + " e " + rangeFormatada[1] + " caracteres! "});
									
								}
								
								$.extend(jsonMessagesExtend, jsonMessagesCampo);
							}
							
						}
						
						/**
						 * min - O usuário define o valor mínimo a ser informado.
						 * Exemplo: min: 4 --> O valor deve ser maior ou igual a 4.
						 */
						if($(this).attr("name") == "min"){
							
							if(!jsonRulesCampo){
								
								jsonRulesCampo = {};
								jsonRulesCampo[campoValidacao] = {"min":parseInt($(this).text())}; 
				
							}
							
							else{
								
								$.extend(jsonRulesCampo[campoValidacao], {"min":parseInt($(this).text())});
								
							}
							
							$.extend(jsonRulesExtend, jsonRulesCampo);
							
							if($(this).attr("message")){
								
								if(!jsonMessagesCampo){
									
									jsonMessagesCampo = {};
									jsonMessagesCampo[campoValidacao] = {"min":$(this).attr("message")};
							
								}
								else{
									
									$.extend(jsonMessagesCampo[campoValidacao], {"min":$(this).attr("message")});
									
								}
								
								$.extend(jsonMessagesExtend, jsonMessagesCampo);
								
							}
							else{
								
								if(!jsonMessagesCampo){
									
									jsonMessagesCampo = {};
									jsonMessagesCampo[campoValidacao] = {"min":" O campo " + labelCampo + " deve ser maior ou igual a " + $(this).text() + "!"};
							
								}
								else{
									
									$.extend(jsonMessagesCampo[campoValidacao], {"min":" O campo " + labelCampo + " deve ser maior ou igual a " + $(this).text() + "!"});
									
								}
								
								$.extend(jsonMessagesExtend, jsonMessagesCampo);
							}
							
						}
						
						/**
						 * max - O usuário define o valor máximo a ser informado.
						 * Exemplo: max: 4 --> O valor deve ser menor ou igual a 4.
						 */
						if($(this).attr("name") == "max"){
							
							if(!jsonRulesCampo){
								
								jsonRulesCampo = {};
								jsonRulesCampo[campoValidacao] = {"max":parseInt($(this).text())}; 
								
							}
							
							else{
								
								$.extend(jsonRulesCampo[campoValidacao], {"max":parseInt($(this).text())});
							}
							
							$.extend(jsonRulesExtend, jsonRulesCampo);
							
							if($(this).attr("message")){
								if(!jsonMessagesCampo){
									
									jsonMessagesCampo = {};
									jsonMessagesCampo[campoValidacao] = {"max":$(this).attr("message")};
							
								}
								else{
									
									$.extend(jsonMessagesCampo[campoValidacao], {"max":$(this).attr("message")});
									
								}
								
								$.extend(jsonMessagesExtend, jsonMessagesCampo);
								
							}
							else{
								
								if(!jsonMessagesCampo){
									
									jsonMessagesCampo = {};
									jsonMessagesCampo[campoValidacao] = {"max":" O campo " + labelCampo + " deve ser menor ou igual a " + $(this).text() + "!"};
							
								}
								else{
									
									$.extend(jsonMessagesCampo[campoValidacao], {"max":" O campo " + labelCampo + " deve ser menor ou igual a " + $(this).text() + "!"});
									
								}
								
								$.extend(jsonMessagesExtend, jsonMessagesCampo);
							}
							
							
						}
						
						/**
						 * range - Limita para o usuário o número de dígitos no campo(somente numéricos). 
						 * Exemplo: range: [2,6] --> 23456. Caso o usuário digitar um número menor do que 2 ou maior do que 6, retorna mensagem de erro para o usuário.
						 * 
						 */
						if($(this).attr("name") == "range"){
							
							if(!jsonRulesCampo){
								
								jsonRulesCampo = {};
								jsonRulesCampo[campoValidacao] = {"range":$(this).text()};
								
							}
							
							else{
								
								$.extend(jsonRulesCampo[campoValidacao],{"range":$(this).text()}); 
							}
							
							$.extend(jsonRulesExtend, jsonRulesCampo);
							
							if($(this).attr("message")){
								
								if(!jsonMessagesCampo){
									
									jsonMessagesCampo = {};
									jsonMessagesCampo[campoValidacao] = {"range":$(this).attr("message")};
							
								}
								else{
									
									$.extend(jsonMessagesCampo[campoValidacao], {"range":$(this).attr("message")});
									
								}
								
								$.extend(jsonMessagesExtend, jsonMessagesCampo);
							}
							else{
								
								var range = $(this).text().replace("[","");
								range = range.replace("]","");
								var rangeFormatada = range.split(",");
								
								if(!jsonMessagesCampo){
									
									jsonMessagesCampo = {};
									jsonMessagesCampo[campoValidacao] = {"range":" O campo " + labelCampo + " deve ser entre " + rangeFormatada[0] + " e " + rangeFormatada[1]};
							
								}
								
								else{
									
									$.extend(jsonMessagesCampo[campoValidacao], {"range":" O campo " + labelCampo + " deve ser entre " + rangeFormatada[0] + " e " + rangeFormatada[1]}); 

								}
								
								$.extend(jsonMessagesExtend, jsonMessagesCampo);
								
							}
							
						}
						
						/**
						 * url - Validação para endereço de site. Nesse método o usuário DEVE informar o endereço completo.
						 * Exemplo: "http://www.meusite.com".
						 */
						if($(this).attr("name") == "url"){
							
							if(!jsonRulesCampo){
								
								jsonRulesCampo = {};
								jsonRulesCampo[campoValidacao] = {"url":true};
								
							}
							
							else{
								
								$.extend(jsonRulesCampo[campoValidacao],{"url":true}); 
							}
							
							$.extend(jsonRulesExtend, jsonRulesCampo);
							
							if($(this).attr("message")){
								
								if(!jsonMessagesCampo){
									
									jsonMessagesCampo = {};
									jsonMessagesCampo[campoValidacao] = {"url":$(this).attr("message")};
							
								}
								else{
									
									$.extend(jsonMessagesCampo[campoValidacao],{"url":$(this).attr("message")});
									
								}
								
								$.extend(jsonMessagesExtend, jsonMessagesCampo);
								
							}
							else{
								
								if(!jsonMessagesCampo){
									
									jsonMessagesCampo = {};
									jsonMessagesCampo[campoValidacao] = {"url":" O campo " + labelCampo + " deve ser preenchido corretamente. Exemplo: https://www.meusite.com"};

									
								}
								else{
									
									$.extend(jsonMessagesCampo[campoValidacao], {"url":" O campo " + labelCampo + " deve ser preenchido corretamente. Exemplo: https://www.meusite.com"});
									
								}
								
								$.extend(jsonMessagesExtend, jsonMessagesCampo);
								
							}
							
						}
						
						/**
						 * date - Obriga o usuário a informar uma data com separações por barra.
						 * Exemplo: 1/1/15 ou 01/01/2015. Não se trata de validação, pois o usuário também pode passar 0/0/0 por exemplo.
						 */
						if($(this).attr("name") == "date"){
							
							if(!jsonRulesCampo){
								
								jsonRulesCampo = {};
								jsonRulesCampo[campoValidacao] = {"date":true};
								
							}
							
							else{
								
								$.extend(jsonRulesCampo[campoValidacao],{"date":true}); 
							}
							
							$.extend(jsonRulesExtend, jsonRulesCampo);
							
							if($(this).attr("message")){
								
								if(!jsonMessagesCampo){
									
									jsonMessagesCampo = {};
									jsonMessagesCampo[campoValidacao] = {"date":$(this).attr("message")};
							
								}
								else{
									
									$.extend(jsonMessagesCampo[campoValidacao],{"date":$(this).attr("message")});
									
								}
								
								$.extend(jsonMessagesExtend, jsonMessagesCampo);
								
							}
							
						}
						
						
						/**
						 * dateISO - Validação para campo de data no padrão americano.
						 * Exemplo: 2015/01/01 (Ano, Mês, Dia).
						 */
						if($(this).attr("name") == "dateISO"){
							
							if(!jsonRulesCampo){
								
								jsonRulesCampo = {};
								jsonRulesCampo[campoValidacao] = {"dateISO":true};
								
							}
							
							else{
								
								$.extend(jsonRulesCampo[campoValidacao],{"dateISO":true}); 
							}
							
							$.extend(jsonRulesExtend, jsonRulesCampo);
							
							if($(this).attr("message")){
								if(!jsonMessagesCampo){
									
									jsonMessagesCampo = {};
									jsonMessagesCampo[campoValidacao] = {"dateISO":$(this).attr("message")};
							
								}
								else{
									
									$.extend(jsonMessagesCampo[campoValidacao],{"dateISO":$(this).attr("message")});
									
								}
								
								$.extend(jsonMessagesExtend, jsonMessagesCampo);
					
							}
							else{
								
								if(!jsonMessagesCampo){
									
									jsonMessagesCampo = {};
									jsonMessagesCampo[campoValidacao] =  {"dateISO":" O campo " + labelCampo + " deve ser preenchido corretamente. Exemplo: 2015/05/26"};
							
								}
								else{
									
									$.extend(jsonMessagesCampo[campoValidacao],{"dateISO":" O campo " + labelCampo + " deve ser preenchido corretamente. Exemplo: 2015/05/26"}); 
									
								}
								
								$.extend(jsonMessagesExtend, jsonMessagesCampo);
								
							}
							
						}
						
						/**
						 * dateITA - Validação para campo de data no padrão brasileiro.
						 * Exemplo: 01/01/2015 (Dia, Mês, Ano).
						 */
						if($(this).attr("name") == "dateITA"){
							
							if(!jsonRulesCampo){
								
								jsonRulesCampo = {};
								jsonRulesCampo[campoValidacao] = {"dateITA":true};
								
							}
							
							else{
								
								$.extend(jsonRulesCampo[campoValidacao],{"dateITA":true}); 
							}
							
							$.extend(jsonRulesExtend, jsonRulesCampo);
							
							if($(this).attr("message")){
								if(!jsonMessagesCampo){
									
									jsonMessagesCampo = {};
									jsonMessagesCampo[campoValidacao] = {"dateITA":$(this).attr("message")};
							
								}
								else{
									
									$.extend(jsonMessagesCampo[campoValidacao],{"dateITA":$(this).attr("message")});
									
								}
								
								$.extend(jsonMessagesExtend, jsonMessagesCampo);
					
							}
							else{
								
								if(!jsonMessagesCampo){
									
									jsonMessagesCampo = {};
									jsonMessagesCampo[campoValidacao] = {"dateITA":" O campo " + labelCampo + " deve ser preenchido corretamente. Exemplo: 26/05/2015 "};
							
								}
							
								else{
									
									$.extend(jsonMessagesCampo[campoValidacao],{"dateITA":" O campo " + labelCampo + " deve ser preenchido corretamente. Exemplo: 26/05/2015 "});
								
								}
								
								$.extend(jsonMessagesExtend, jsonMessagesCampo);
							}
							
							
						}
						
						/**
						 * number - Validação para campo numérico, obriga o usuário a digitar somente numérico. Caso contrário
						 * uma mensagem de erro é mostrada.
						 */
						if($(this).attr("name") == "number"){
							
							if(!jsonRulesCampo){
								
								jsonRulesCampo = {};
								jsonRulesCampo[campoValidacao] = {"number":true};
								
							}
							
							else{
								
								$.extend(jsonRulesCampo[campoValidacao], {"number":true}); 
								 
							}
							
							$.extend(jsonRulesExtend, jsonRulesCampo);
							
							if($(this).attr("message")){
								
								if(!jsonMessagesCampo){
									
									jsonMessagesCampo = {};
									jsonMessagesCampo[campoValidacao] = {"number":$(this).attr("message")};
							
								}
								else{
									
									$.extend(jsonMessagesCampo[campoValidacao],{"number":$(this).attr("message")});
									
								}
								
								$.extend(jsonMessagesExtend, jsonMessagesCampo);
								
							}
							else{
								
								if(!jsonMessagesCampo){
									
									jsonMessagesCampo = {};
									jsonMessagesCampo[campoValidacao] = {"number":" O campo " + labelCampo + " deve ser numérico! "};
							
								}
								else{
									
									$.extend(jsonMessagesCampo[campoValidacao], {"number":" O campo " + labelCampo + " deve ser numérico! "});
									
								}
								
								$.extend(jsonMessagesExtend, jsonMessagesCampo);
							}
							
						}
						
						/**
						 * digits - Valida o campo obrigando o usuário a inserir somente dígitos.
						 */
						if($(this).attr("name") == "digits"){
							
							if(!jsonRulesCampo){
								
								jsonRulesCampo = {};
								jsonRulesCampo[campoValidacao] = {"digits":true};
								
							}
							
							else{
								
								$.extend(jsonRulesCampo[campoValidacao], {"digits":true}); 
								 
							}
							
							$.extend(jsonRulesExtend, jsonRulesCampo);
							
							if($(this).attr("message")){
								
								
								if(!jsonMessagesCampo){
									
									jsonMessagesCampo = {};
									jsonMessagesCampo[campoValidacao] = {"digits":$(this).attr("message")};
							
								}
								else{
									
									$.extend(jsonMessagesCampo[campoValidacao],{"digits":$(this).attr("message")});
									
								}
								
								$.extend(jsonMessagesExtend, jsonMessagesCampo);
								
							}
							else{
								
								if(!jsonMessagesCampo){
									
									jsonMessagesCampo = {};
									jsonMessagesCampo[campoValidacao] = {"digits":" O campo " + labelCampo + " deve conter apenas digitos ! "};
							
								}
								else{
									
									$.extend(jsonMessagesCampo[campoValidacao], {"digits":" O campo " + labelCampo + " deve conter apenas digitos ! "});
									
								}
								
								$.extend(jsonMessagesExtend, jsonMessagesCampo);
								
							}
							
						}
						
						/**
						 * creditcard - Validação para Cartão de Crédito. Com essa validação o usuário só consegue passar pelo campo
						 * caso informar um número de cartão válido. 
						 */
						if($(this).attr("name") == "creditcard"){
							

							if(!jsonRulesCampo){
								
								jsonRulesCampo = {};
								jsonRulesCampo[campoValidacao] = {"creditcard":true};
								
							}
							
							else{
								
								$.extend(jsonRulesCampo[campoValidacao], {"creditcard":true}); 
								 
							}
							
							$.extend(jsonRulesExtend, jsonRulesCampo);
							
							if($(this).attr("message")){
								
								if(!jsonMessagesCampo){
									
									jsonMessagesCampo = {};
									jsonMessagesCampo[campoValidacao] = {"creditcard":$(this).attr("message")};
							
								}
								else{
									
									$.extend(jsonMessagesCampo[campoValidacao],{"creditcard":$(this).attr("message")});
									
								}
								
								$.extend(jsonMessagesExtend, jsonMessagesCampo);
								
								
							}
							else{
								
								if(!jsonMessagesCampo){
									
									jsonMessagesCampo = {};
									jsonMessagesCampo[campoValidacao] = {"creditcard":" O nº do cartão de credito do campo " + labelCampo + " não existe! "};
							
								}
								else{
									
									$.extend(jsonMessagesCampo[campoValidacao], {"creditcard":" O nº do cartão de credito do campo " + labelCampo + " não existe! "});	
									
								}
								
								$.extend(jsonMessagesExtend, jsonMessagesCampo);
								
							}
							
						}
						
						/**
						 * equalTo - Esse método é utilizado para comparar por exemplo senhas, quando solicitado a confirmação do mesmo.
						 * Após inserido a primeira informação, o usuário deve passar a mesma informação no próximo campo.
						 * como passar os campos jsf="#nomeFormulario\\:nomeCampo", jsp e html simples = "#nomeFormulario #nomeCampo"
						 */
						if($(this).attr("name") == "equalTo"){
							
							
							if(!jsonRulesCampo){
								
								jsonRulesCampo = {};
								jsonRulesCampo[campoValidacao] =  {"equalTo":$(this).text()};
								
							}
							
							else{
								
								$.extend(jsonRulesCampo[campoValidacao], {"equalTo":$(this).text()});
								
							}
							
							$.extend(jsonRulesExtend, jsonRulesCampo);
							
							if($(this).attr("message")){
								
								if(!jsonMessagesCampo){
									
									jsonMessagesCampo = {};
									jsonMessagesCampo[campoValidacao] = {"equalTo":$(this).attr("message")};
							
								}
								else{
									
									$.extend(jsonMessagesCampo[campoValidacao],{"equalTo":$(this).attr("message")});
									
								}
								
								$.extend(jsonMessagesExtend, jsonMessagesCampo);
								
							}
							else{
								
								if(!jsonMessagesCampo){
									
									jsonMessagesCampo = {};
									jsonMessagesCampo[campoValidacao] = {"equalTo":"O campo " + labelCampo + " deve ser igual"};
								}
								
								else {
									
									$.extend(jsonMessagesCampo[campoValidacao], {"equalTo": "O campo " + labelCampo + " deve ser igual"});
								}
								
								$.extend(jsonMessagesExtend, jsonMessagesCampo);
							}
							
						}
						
						/**
						 * cnpjValidator - Método para o usuário validar o CNPJ. Impede o usuário de inserir digitos inválidos
						 * para um número de CNPJ, podendo passar OU não a máscara.
						 * Exemplo: 78.425.986/0036-15 ou 78425986003615.
						 */
						if($(this).attr("name") == "cnpjValidator"){
							
							if(!jsonRulesCampo){
								
								jsonRulesCampo = {};
								jsonRulesCampo[campoValidacao] = {"cnpjValidator":true}; 
							}
							
							else{
								
								$.extend(jsonRulesCampo[campoValidacao], {"cnpjValidator":true});
								
							}
							
							$.extend(jsonRulesExtend, jsonRulesCampo);
							
							if($(this).attr("message")){
								
								if(!jsonMessagesCampo){
									
									
									jsonMessagesCampo = {};
									jsonMessagesCampo[campoValidacao] = {"cnpjValidator":$(this).attr("message")};
									
								}
								else{
									
									$.extend(jsonMessagesCampo[campoValidacao], {"cnpjValidator":$(this).attr("message")});
									
								}
								
								$.extend(jsonMessagesExtend, jsonMessagesCampo);
								
							}
							else{
								
								if(!jsonMessagesCampo){
									
									jsonMessagesCampo = {};
									jsonMessagesCampo[campoValidacao] = {"cnpjValidator":" Digite um CNPJ em " + labelCampo + " com formato válido! "};
									
							
								}
								else{
									
									$.extend(jsonMessagesCampo[campoValidacao], {"cnpjValidator":" Digite um CNPJ em  " + labelCampo + " com formato válido! "});

								}
								
								$.extend(jsonMessagesExtend, jsonMessagesCampo);
								
							}
							
						}
						
						/**
						 * cpfValidator - Método para o usuário validar o CPF. Impede o usuário de inserir digitos inválidos
						 * para um número de CPF, podendo passar OU não a máscara.
						 * Exemplo: 341.514.318-02 ou 34151431802 .
						 */
						if($(this).attr("name") == "cpfValidator"){
							
							if(!jsonRulesCampo){
								
								jsonRulesCampo = {};
								jsonRulesCampo[campoValidacao] = {"cpfValidator":true}; 
							}
							
							else{
								
								$.extend(jsonRulesCampo[campoValidacao], {"cpfValidator":true});
								
							}
							
							$.extend(jsonRulesExtend, jsonRulesCampo);
							
							if($(this).attr("message")){
								
								if(!jsonMessagesCampo){
									
									
									jsonMessagesCampo = {};
									jsonMessagesCampo[campoValidacao] = {"cpfValidator":$(this).attr("message")};
									
								}
								else{
									
									$.extend(jsonMessagesCampo[campoValidacao], {"cpfValidator":$(this).attr("message")});
									
								}
								
								$.extend(jsonMessagesExtend, jsonMessagesCampo);
								
							}
							else{
								
								if(!jsonMessagesCampo){
									
									jsonMessagesCampo = {};
									jsonMessagesCampo[campoValidacao] = {"cpfValidator":" Digite um CPF em  " + labelCampo + " com formato válido! "};
									
							
								}
								else{
									
									$.extend(jsonMessagesCampo[campoValidacao], {"cpfValidator":" Digite um CPF em " + labelCampo + " com formato válido! "});

								}
								
								$.extend(jsonMessagesExtend, jsonMessagesCampo);
								
							}
						}
						
						/**
						 * urlShort - Validação para endereço de site. Nesse método o usuário não precisa passar o endereço completo
						 * iniciando pelo "http".
						 * Exemplo: "www.meusite.com".
						 */
						if($(this).attr("name") == "urlShort"){
							
							if(!jsonRulesCampo){
								
								jsonRulesCampo = {};
								jsonRulesCampo[campoValidacao] = {"urlShort":true}; 
							}
							
							else{
								
								$.extend(jsonRulesCampo[campoValidacao], {"urlShort":true});
								
							}
							
							$.extend(jsonRulesExtend, jsonRulesCampo);
							
							if($(this).attr("message")){
								
								if(!jsonMessagesCampo){
									
									
									jsonMessagesCampo = {};
									jsonMessagesCampo[campoValidacao] = {"urlShort":$(this).attr("message")};
									
								}
								else{
									
									$.extend(jsonMessagesCampo[campoValidacao], {"urlShort":$(this).attr("message")});
									
								}
								
								$.extend(jsonMessagesExtend, jsonMessagesCampo);
								
							}
							else{
								
								if(!jsonMessagesCampo){
							
									jsonMessagesCampo = {};
									jsonMessagesCampo[campoValidacao] = {"urlShort":" O campo " + labelCampo + " deve ser preenchido corretamente. Exemplo: www.meusite.com "};
									
									
								}
								else{

									$.extend(jsonMessagesCampo[campoValidacao], {"urlShort":$(this).attr("message")});
										
								}
								
								$.extend(jsonMessagesExtend, jsonMessagesCampo);
							}
							
						}
						 
					 }); 
					
					//Caso a string esteja vazia não há nenhuma verificação no campo
					if(jsonRulesCampo){
						
						//concatena o json a cada campo, depois de ter passado por todos os spans
						$.extend(jsonRules, jsonRulesExtend);
			
					}
					
					if(jsonMessagesCampo){
						
						$.extend(jsonMessages, jsonMessagesExtend);
									
					}
					
					
				}
				
			}
		 	
	}
	
	
	//dados default que melhor atendem o contexto
	var dadosDefault = {
			
			"debug":false,
			"ignore":[],
			"onsubmit":true,
			submitHandler: function(form) {
			
				var divErro = document.getElementById('msgErro');
				
				if(jsonOptions.customFunctionValidation != null){
			
					if(jsonOptions.customFunctionValidation(divErro)){
						  form.submit();
					}
			
				}
				
				else{
					
					form.submit();
				}
	
			 },
			 
			 errorPlacement: function(element, error){
					
					
					
			 },
			
			 invalidHandler: function(form, validator){
				
			     stringMensagem = "";
			          
			          if (validator.errorList.length > 0) {
		                    for (var i=0;i<validator.errorList.length;i++) {
		                    stringMensagem += "<div class='msg_erro'>";
		                    stringMensagem += validator.errorList[i].message;
		                    stringMensagem += "</div>";
		                     
		         
		                    }
			          }
			         var erros = validator.numberOfInvalids();
			          
			         if(erros){ 
			        	 
				        $("#msgErro").empty();
				        $("#msgErro").append(stringMensagem);
				        $("#msgErro").show();
				        
			         }
			         
			         else {
			        	  $("#msgErro").hide();
			         }
			          
			},

			rules:jsonRules,
			messages:jsonMessages
			
			
	};
	
	$.extend(dadosDefault, jsonOptions);
	$(seletor).validate(dadosDefault);
	
};